﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using Tecnopez.Globals;
using BussinessLogicTecnoPez;
using BussinessLogicTecnoPez.AtencionCliente.Cliente;
using BussinessLogicTecnoPez.AtencionCliente.Pedido;
using BussinessLogicTecnoPez.Tipos_Comunes;
using BussinessLogicTecnoPez.Utils;
using BussinessLogicTecnoPez.Produccion.Producto;
using BussinessLogicTecnoPez.Produccion.Enfermedades_y_control_de_estanques;

using System.Transactions;

public partial class Modules_AtencionCliente_Pedido_ABMRemitos : System.Web.UI.Page
{
    private const string VIEW_STATE_ID_EMPLEADO = "VIEW_STATE_ID_EMPLEADO";
    private const string VIEW_STATE_ID_MONEDA = "VIEW_STATE_ID_MONEDA";

    private Empleado VIEW_STATE_EMPLEADO
    {
        get
        {
            int IdEmpleado = Convert.ToInt32(ViewState[VIEW_STATE_ID_EMPLEADO]);
            Empleado.getManager.ClearFilters();
            Empleado.getManager.AddFilter("IDEMPLEADO", GenericManager<Empleado>.filterOperator.Equals, IdEmpleado);
            return Empleado.getManager.GetOne();
        }
        set
        {
            ViewState[VIEW_STATE_ID_EMPLEADO] = value.IdEmpleado.ToString();
        }
    }
    private TipoMoneda VIEW_STATE_MONEDA
    {
        get
        {
            int IdMoneda = Convert.ToInt32(ViewState[VIEW_STATE_ID_MONEDA]);
            TipoMoneda.getManager.ClearFilters();
            TipoMoneda.getManager.AddFilter("IDTIPOMONEDA", GenericManager<TipoMoneda>.filterOperator.Equals, IdMoneda);
            return TipoMoneda.getManager.GetOne();
        }
        set
        {
            ViewState[VIEW_STATE_ID_MONEDA] = value.IdTipoMoneda.ToString();
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack == false)
        {
            SetMode(PageMode.ListMode);
        }

        TPPBuscarTransportista.ObjType = typeof(Transportista);
        TPPPedido.ObjType = typeof(Pedido);
        TPPPedido.personalizarGestorAntesDelGetAll(setFilterPedido);
        TPPTransportista.ObjType = typeof(Transportista);

        InicializarGrilla();

        GenericMasterPage master = (GenericMasterPage)this.Master;
        master.Imagen = "../Styles/Icons/wordprocessing.png";
        master.Titulo = "Gestión de Remitos";
        _lblError.Text = "";
    }
    private void setFilterPedido(object Manager)
    {
        EntityBase<Pedido>.getManager.AddFilter("TIPOESTADOPEDIDO", GenericManager<Pedido>.filterOperator.Equals, Convert.ToInt32(TipoEstadoPedido.TiposEstadosPedidos.PendienteEnviar));
        EntityBase<Pedido>.getManager.AddOrder("PRIORIDAD", GenericManager<Pedido>.Order.orderDirection.ASC);
    }
    private void InicializarGrilla()
    {
        grdRemitos.setupGrid(typeof(Remito), cargarGrilla, true, true, this.ViewState);
    }

    private void SetMode(PageMode mode)
    {
        ViewState["PageMode"] = mode;
        switch (mode)
        {
            case PageMode.ListMode:
                mvABM.ActiveViewIndex = 0;
                break;
            case PageMode.NewMode:
                mvABM.ActiveViewIndex = 1;

                txtId.ReadOnly = true;
                txtDestino.ReadOnly = false;
                txtObservaciones.ReadOnly = false;
                TPPPedido.Enable = true;
                TPPTransportista.Enable = true;
                TPCFechaEnvio.Enabled = true;
                chkAnulado.Enabled = false;

                cmdAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = false;
                cmdEliminar.Enabled = false;
                cmdPedido.Enabled = true;
                break;
            case PageMode.EditMode:
                mvABM.ActiveViewIndex = 1;

                txtId.ReadOnly = true;
                txtDestino.ReadOnly = false;
                txtObservaciones.ReadOnly = false;
                TPPPedido.Enable = true;
                TPPTransportista.Enable = true;
                TPCFechaEnvio.Enabled = true;
                chkAnulado.Enabled = false;

                cmdAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = false;
                cmdEliminar.Enabled = false;
                cmdPedido.Enabled = true;
                break;
            case PageMode.ViewMode:
                mvABM.ActiveViewIndex = 1;

                txtId.ReadOnly = true;
                txtDestino.ReadOnly = true;
                txtObservaciones.ReadOnly = true;
                TPPPedido.Enable = false;
                TPPTransportista.Enable = false;
                TPCFechaEnvio.Enabled = false;
                chkAnulado.Enabled = false;

                cmdAceptar.Visible = false;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = true;
                cmdEliminar.Enabled = true;
                cmdPedido.Enabled = false;
                break;
        }
    }

    private void cargarGrilla()
    {
        Remito.getManager.ClearFilters();
        Remito.getManager.ClearOrders();
        Remito.getManager.AddFilter("idRemito", GenericManager<Remito>.filterOperator.Like, "%" + txtBuscarCodigo.Text.Trim() + "%");

        if (TPPBuscarTransportista.ItemSelected != null)
        {
            Transportista objTransportista = TPPBuscarTransportista.ItemSelected as Transportista;
            Remito.getManager.AddFilter("TRANSPORTISTA", GenericManager<Remito>.filterOperator.Equals, objTransportista.IdTransportista);
        }

        if (ViewState[grdRemitos.PageDataViewOrderKey] == null)
        {
            Remito.getManager.AddOrder("idRemito", GenericManager<Remito>.Order.orderDirection.DESC);
        }
        else
        {
            Remito.getManager.AddOrder(ViewState[grdRemitos.PageDataViewOrderKey].ToString(), (GenericManager<Remito>.Order.orderDirection)ViewState[grdRemitos.PageDataViewOrdenDireccionKey]);
        }

        List<Remito> lista = new List<Remito>();
        lista = Remito.getManager.GetFilter();
        grdRemitos.DataSource = lista;
        grdRemitos.DataBind();

    }
    protected void cmdNuevo_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.NewMode);
        txtId.Text = "";
        txtDestino.Text = "";
        txtObservaciones.Text = "";
        TPPPedido.ItemSelected = null;
        TPPTransportista.ItemSelected = null;
        TPCFechaEnvio.Text = DateTime.Today.ToShortDateString();
        Empleado objEmpleado = Functions.getEmpleadoLogueado(this.Page);
        lblEmpleado.Text = objEmpleado.ToString();
        this.VIEW_STATE_EMPLEADO = objEmpleado;
        chkAnulado.Checked = false;
        lblFechaRecepcion.Text = "";
        
    }
    protected void cmdEditar_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.EditMode);
    }
    protected void cmdEliminar_Click(object sender, EventArgs e)
    {
        try
        {
            int idRemito = Convert.ToInt32(txtId.Text);
            Remito.getManager.ClearFilters();
            Remito.getManager.AddFilter("idRemito", GenericManager<Remito>.filterOperator.Equals, idRemito);
            Remito objRemito = Remito.getManager.GetOne();

            objRemito.Anulado = true;

            if (!Remito.getManager.Update(objRemito))
            {
                throw Remito.getManager.GeneratedException;
            }
            SetMode(PageMode.ListMode);
            cargarGrilla();
        }
        catch (Exception ex)
        {
            _lblError.Text = ex.Message;
        }
    }
    protected void cmdAceptar_Click(object sender, EventArgs e)
    {
        try
        {
            Remito objRemito = new Remito();

            objRemito.Empleado = this.VIEW_STATE_EMPLEADO;
            objRemito.Anulado = this.chkAnulado.Checked;
            objRemito.Destino = txtDestino.Text.Trim();
            objRemito.Observaciones = txtObservaciones.Text.Trim();
            objRemito.Pedido = TPPPedido.ItemSelected as Pedido;
            objRemito.Transportista = TPPTransportista.ItemSelected as Transportista;

            DateTime auxDate;
            if (!DateTime.TryParse(TPCFechaEnvio.Text, out auxDate))
            {
                this._lblError.Text = "Fecha envío no posee el formato correcto.";
                return;
            }
            else
                objRemito.FechaEnvio = auxDate;

            if (lblFechaRecepcion.Text.Trim() != string.Empty)
                objRemito.FechaRecepcion = Convert.ToDateTime(lblFechaRecepcion.Text);

            objRemito.DetalleRemito = this.GetDetalleRemito();

            using (TransactionScope objScope = new TransactionScope())
            {
                if (getMode() == PageMode.NewMode)
                {
                    if (Remito.getManager.Insert(objRemito) != true)
                    {
                        throw Remito.getManager.GeneratedException;
                    }
                    SetMode(PageMode.ListMode);
                    cargarGrilla();
                }
                else
                {
                    objRemito.IdRemito = int.Parse(txtId.Text.Trim());
                    if (Remito.getManager.Update(objRemito) != true)
                    {
                        throw Remito.getManager.GeneratedException;
                    }
                    SetMode(PageMode.ViewMode);
                }
                TipoEstadoPedido.getManager.ClearFilters();
                TipoEstadoPedido.getManager.AddFilter("IDTIPOESTADOPEDIDO", GenericManager<TipoEstadoPedido>.filterOperator.Equals, Convert.ToInt32(TipoEstadoPedido.TiposEstadosPedidos.Enviado));
                objRemito.Pedido.TipoEstadoPedido = TipoEstadoPedido.getManager.GetOne();
                if (Pedido.getManager.Update(objRemito.Pedido) != true)
                {
                    throw Pedido.getManager.GeneratedException;
                }
                objScope.Complete();
            }
        }
        catch (Exception exc)
        {
            _lblError.Text = "error: No se pudo realizar la operación";
            Functions.LogError(exc);
        }
    }
    private DetalleRemito GetDetalleRemito()
    {
        Pedido objPedido = TPPPedido.ItemSelected as Pedido;
        return new DetalleRemito(objPedido.DetallePedido);
    }
    private PageMode getMode()
    {
        if (ViewState["PageMode"] == null)
            return PageMode.ModeNotFound;
        return (PageMode)ViewState["PageMode"];
    }
    protected void cmdCancelar_Click(object sender, EventArgs e)
    {
        SetMode(PageMode.ListMode);
    }
    protected void grdRemitos_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (grdRemitos.Rows[0].Cells[0].Text == "&nbsp;")
        {
            return;
        }
        /*
         * si el remito tiene fecha recepcion, no se puede editar ni anular
         * si ya esta anulado no se puede recibir
         */
        if (e.CommandName == "ver")
        {
            int IdRemito = int.Parse(grdRemitos.DataKeys[System.Convert.ToInt32(e.CommandArgument)].Value.ToString());
            Remito.getManager.ClearFilters();
            Remito.getManager.AddFilter("IDRemito", GenericManager<Remito>.filterOperator.Equals, IdRemito);
            Remito objRemito = Remito.getManager.GetOne();

            txtId.Text = objRemito.IdRemito.ToString();
            chkAnulado.Checked = objRemito.Anulado;
            txtDestino.Text = objRemito.Destino;
            lblEmpleado.Text = objRemito.Empleado.ToString();
            this.VIEW_STATE_EMPLEADO = objRemito.Empleado;
            TPCFechaEnvio.Text = objRemito.FechaEnvio.ToShortDateString();
            if (objRemito.FechaRecepcion == null || objRemito.FechaRecepcion == DateTime.MinValue)
                lblFechaRecepcion.Text = "";
            else
                lblFechaRecepcion.Text = objRemito.FechaRecepcion.ToShortDateString();
            txtObservaciones.Text = objRemito.Observaciones;
            TPPPedido.ItemSelected = objRemito.Pedido;
            TPPTransportista.ItemSelected = objRemito.Transportista;

            SetMode(PageMode.ViewMode);

            if (objRemito.FechaRecepcion != null && objRemito.FechaRecepcion > DateTime.MinValue)
            {
                cmdEliminar.OnClientClick = "alert('No se puede anular el remito debido a que ya ha sido enviado y recibido'); return false";
                cmdEditar.OnClientClick = "alert('No se puede editar el remito debido a que ya ha sido enviado y recibido'); return false";
            }
            else
            {
                if (objRemito.Anulado)
                {
                    cmdEliminar.OnClientClick = "alert('El remito ya ha sido anulado'); return false";
                    cmdEditar.OnClientClick = "alert('No se puede editar el remito debido a que ha sido anulado'); return false";
                }
                else
                {
                    cmdEliminar.OnClientClick = "if (!confirm('Desea anular el remito?')){return false;}";
                    cmdEditar.OnClientClick = "";
                }
            }            
        }
    }
    protected void cmdPedido_Click(object sender, EventArgs e)
    {
        if (TPPPedido.ItemSelected != null)
        {
            mvABM.ActiveViewIndex = 2;
            Pedido objPedido = TPPPedido.ItemSelected as Pedido;

            this.lblIdPedido.Text = objPedido.IdPedido.ToString();
            this.lblEstadoPedido.Text = objPedido.TipoEstadoPedido.ToString();
            this.lblEmpleadoPedido.Text = objPedido.Empleado.ToString();
            this.lblFechaEmisionPedido.Text = objPedido.FechaEmision.ToShortDateString();
            this.lblFechaEntregaPedido.Text = objPedido.FechaEntrega.ToShortDateString();
            this.lblPrioridadPedido.Text = System.Enum.Parse(typeof(AppEnums.PedidoPrioridad), objPedido.Prioridad.ToString(), true).ToString();
            this.lblTipoEntregaPedido.Text = System.Enum.Parse(typeof(AppEnums.PedidoTipoEntrega), objPedido.TipoEntrega.ToString(), true).ToString();
            this.lblMonedaPedido.Text = objPedido.TipoMoneda.ToString();
            this.lblMontoPedido.Text = objPedido.Monto.ToString();

            grdDetallePedido.setupGrid(typeof(DetallePedidoView), cargarGrillaDetallePedido, true, false, this.ViewState, new DataControlField[0]);
        }
        else
        {
            Functions.MessageBox("Debe seleccionar un pedido primero", this.Page);
        }
    }
    private void cargarGrillaDetallePedido()
    {
        if (TPPPedido.ItemSelected != null)
        {
            Pedido objPedido = TPPPedido.ItemSelected as Pedido;
            List<DetallePedidoView> objList = new List<DetallePedidoView>();
            foreach (ItemDetallePedido objItem in objPedido.DetallePedido.ItemList)
            {
                objList.Add(new DetallePedidoView(objItem));
            }
            grdDetallePedido.DataSource = objList;
        }
        else
        {
            grdDetallePedido.DataSource = null;
        }
        grdDetallePedido.DataBind();
    }
    protected void cmdVolver_Click(object sender, EventArgs e)
    {
        mvABM.ActiveViewIndex = 1;
    }
}
/// <summary>
/// Utilizada para manejar la grilla de detalle de pedido
/// </summary>
public class DetallePedidoView
{
    private Producto objProducto;
    private decimal cantidad;
    private decimal precio;

    public DetallePedidoView()
    {
        this.objProducto = null;
        this.cantidad = 0;
        this.precio = 0;
    }

    public DetallePedidoView(Producto objProducto, decimal cantidad, decimal precio)
    {
        this.objProducto = objProducto;
        this.cantidad = cantidad;
        this.precio = precio;
    }

    public DetallePedidoView(ItemDetallePedido objItem)
    {
        this.objProducto = objItem.Producto;
        this.cantidad = objItem.Cantidad;
        this.precio = objItem.Precio;
    }

    [FriendlyName("Producto", true)]
    [DBField("IDPRODUCTO", true, false, true, "IDPRODUCTO")]
    public Producto Producto
    {
        get { return objProducto; }
        set { objProducto = value; }
    }

    [FriendlyName("Cantidad", true)]
    [DBField("CANTIDAD", false, false)]
    public decimal Cantidad
    {
        get { return cantidad; }
        set { cantidad = value; }
    }

    [FriendlyName("Precio", true)]
    [DBField("PRECIO", false, false)]
    public decimal Precio
    {
        get { return precio; }
        set { precio = value; }
    }
}